package old;

import old.interfaces.ZarzadcaMenu;
import java.io.IOException;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

public class Menu
{
    protected static Image grafika = null;
    
    protected Odbiorca odbiorca;
    protected ZarzadcaMenu zarzadca;
    
    public ElementMenu[] elementy;
    
    public int szerokoscMenu;
    public int wysokoscMenu;
    public int wysokoscElementu;
    
    private Font czcionka = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);;
    
    public int kolorTla = 0xaaaaaa;
    public int kolorTekstu = 0x0;
    public int kolorWybranegoTla = 0xeecc44;
    public int kolorWybranegoTekstu = 0x0099ff;
    
    private int pierwszyElement = 0;
    private int wybranyElement = 0;
    private int widoczneElementy;
    
    protected boolean trzebaPrzewijac = false;
    
    public Menu(ElementMenu[] e)
    {
        elementy = e;
        if(wczytajGrafike("/gui/images/arrows.png") == false)
            throw new IllegalStateException("Nie udało się załadować grafiki");
    }
    
    public void ustawOdbiorce(Odbiorca o)
    {
        odbiorca = o;
    }
    
    private boolean wczytajGrafike(String adres)
    {
        if(grafika != null)
            return true;
        try
        {
            grafika = Image.createImage(adres);
            return true;
        }
        catch(IOException e)
        {
            e.printStackTrace();
            return false;
        }
    }

    public void przygotuj(ZarzadcaMenu z, int szerokosc, int wysokosc)
    {
        zarzadca = z;
        // wysokość i szerokość menu nie większe niż 2/3 ekranu
        wysokoscElementu = czcionka.getHeight() + 2;
        szerokoscMenu = 0;
        int akt;
        for(int i = 0; i < elementy.length; ++i)
        {
            akt = czcionka.stringWidth(elementy[i].tekst);
            if(akt > szerokoscMenu)
                szerokoscMenu = akt;
        }
        szerokoscMenu += 8;
        if(szerokoscMenu < 80)
            szerokoscMenu = 80;
        else if(szerokoscMenu > szerokosc)
            szerokoscMenu = szerokosc;
        
        wysokoscMenu = elementy.length * wysokoscElementu;
        wysokoscMenu += 6;
        if(wysokoscMenu > wysokosc)
        {
            wysokoscMenu = (wysokosc - 22) / wysokoscElementu * wysokoscElementu + 22;
            trzebaPrzewijac = true;
            widoczneElementy = (wysokoscMenu - 22) / wysokoscElementu;
        }
        else
            widoczneElementy = elementy.length;
        pierwszyElement = 0;
        wybranyElement = 0;
    }
    
    public void rysuj(Graphics g)
    {
        if(elementy == null)
            throw new NullPointerException("Brak elementów do wyświetlenia.");

        int szerokoscElementu = szerokoscMenu - 6;
        int temp;
        
        g.setFont(czcionka);
        g.setClip(0, 0, szerokoscMenu, wysokoscMenu);
        g.setColor(kolorTla);
        g.fillRect(0, 0, szerokoscMenu, wysokoscMenu);
        g.setColor(kolorTekstu);
        g.drawRect(0, 0, szerokoscMenu - 1, wysokoscMenu - 1);
        g.translate(3, 3);
        
        if(trzebaPrzewijac)
        {
            temp = (wybranyElement == 0 ? 8 : 0);
            g.drawRegion(grafika, temp, 0, 8, 8, Sprite.TRANS_NONE, szerokoscElementu / 2, 4, Graphics.HCENTER | Graphics.VCENTER);
            
            temp = (wybranyElement == elementy.length - 1 ? 24 : 16);
            g.drawRegion(grafika, temp, 0, 8, 8, Sprite.TRANS_NONE, szerokoscElementu / 2, wysokoscMenu - 14, Graphics.HCENTER | Graphics.TOP);
            g.translate(0, 8);
            g.setClip(0, 0, szerokoscElementu, wysokoscMenu - 22);
        }
        else
            g.setClip(0, 0, szerokoscElementu, wysokoscMenu - 6);
        
        
        for(int i = pierwszyElement; i < pierwszyElement + widoczneElementy; ++i)
        {
            g.setColor(kolorTekstu);
            if(wybranyElement == i)
            {
                g.setColor(kolorWybranegoTla);
                g.fillRect(0, 0, szerokoscElementu, wysokoscElementu);
                g.setColor(kolorTekstu);
            }
            g.drawString(elementy[i].tekst, 2, 1, 0);
            g.translate(0, wysokoscElementu);
        }
    }

    protected void obslugaKlawiszy(int kod)
    {
        boolean odmaluj = false;
        switch(kod)
        {
            case -1:    // UP
                if(--wybranyElement < 0)
                    wybranyElement = elementy.length - 1;
                odmaluj = true;
                break;
            case -2:    // DOWN
                if(++wybranyElement >= elementy.length)
                    wybranyElement = 0;
                odmaluj = true;
                break;
            case -5:
                zarzadca.ukryjMenu(this);
                if(odbiorca != null)
                    odbiorca.zdarzenieMenu(this, elementy[wybranyElement].kod);
                break;
            default:
                System.out.println("kod klawisza: " + kod);
                break;
        }
        if(odmaluj)
        {
            if(wybranyElement < pierwszyElement)
                pierwszyElement = wybranyElement;
            else if(wybranyElement >= pierwszyElement + widoczneElementy)
                pierwszyElement = wybranyElement - widoczneElementy + 1;
            zarzadca.odrysujMenu(this);
        }
    }

    public static class ElementMenu
    {
        public String tekst;
        public int kod;
        public ElementMenu(String t, int k)
        {
            tekst = t;
            kod = k;
        }
    }
    
    public static interface Odbiorca
    {
        public void zdarzenieMenu(Menu nadawca, int kod);
    }
}
